# \source-code\path_history.py

import json
from typing import List, Optional
import os

from setting import resource_path

class PathHistory:
    """
    管理用户输入的文件夹路径历史记录。
    路径分为两类：复制的源文件夹路径 和 输出目录路径。
    默认路径不会被记录。
    """
    
    def __init__(self, history_file: str = "PathHistory.json"):
        """
        初始化路径历史记录。
        
        Args:
            history_file (str): 存储路径历史的 JSON 文件名。
        """
        # 使用固定路径，相对于当前文件
        self.history_file = resource_path(history_file)  # 使用 resource_path
        self.source_paths: List[str] = []  # 复制的源文件夹路径
        self.output_paths: List[str] = []  # 输出目录路径
        
        # 如果文件不存在，则创建一个空的
        if not os.path.exists(self.history_file):
            self._save_to_file()
        else:
            self._load_from_file()

    
    def _load_from_file(self):
        """从 JSON 文件加载路径历史。"""
        try:
            
            with open(self.history_file, 'r', encoding='utf-8') as f:
                data = json.load(f)
                self.source_paths = data.get("source_paths", [])
                self.output_paths = data.get("output_paths", [])
        except (json.JSONDecodeError, FileNotFoundError, PermissionError, OSError) as e:
            print(f"警告：加载路径历史失败 ({e})。将使用空的历史记录。")
            self.source_paths = []
            self.output_paths = []
    
    def _save_to_file(self):
        """将路径历史保存到 JSON 文件。"""
        try:
            data = {
                "source_paths": self.source_paths,
                "output_paths": self.output_paths
            }
            with open(self.history_file, 'w', encoding='utf-8') as f:
                json.dump(data, f, indent=2, ensure_ascii=False)
        except (PermissionError, OSError) as e:
            print(f"警告：无法保存路径历史到 {self.history_file} ({e})")
    
    def add_source_path(self, path: str):
        """
        添加一个源文件夹路径到历史记录。
        如果路径已存在，则移到列表末尾（最新使用）。
        
        Args:
            path (str): 源文件夹路径。
        """
        path_str = str(path)
        if path_str in self.source_paths:
            self.source_paths.remove(path_str)
        self.source_paths.append(path_str)
        self._save_to_file()
    
    def add_output_path(self, path: str):
        """
        添加一个输出目录路径到历史记录。
        如果路径已存在，则移到列表末尾（最新使用）。
        
        Args:
            path (str): 输出目录路径。
        """
        path_str = str(path)
        if path_str in self.output_paths:
            self.output_paths.remove(path_str)
        self.output_paths.append(path_str)
        self._save_to_file()
    
    def get_source_path_by_index(self, index: int) -> Optional[str]:
        """
        根据索引获取源文件夹路径。
        
        Args:
            index (int): 1-based 索引。
            
        Returns:
            Optional[str]: 对应的路径，如果索引无效则返回 None。
        """
        if 1 <= index <= len(self.source_paths):
            return self.source_paths[index - 1]
        return None
    
    def get_output_path_by_index(self, index: int) -> Optional[str]:
        """
        根据索引获取输出目录路径。
        
        Args:
            index (int): 1-based 索引。
            
        Returns:
            Optional[str]: 对应的路径，如果索引无效则返回 None。
        """
        if 1 <= index <= len(self.output_paths):
            return self.output_paths[index - 1]
        return None
    
    def display_paths(self,type: int):
        """打印所有历史路径，按 1., 2., 3. 标号。"""
        print("历史路径记录：")
        
        if type == 1:
            if self.source_paths:
                print("【复制的文件夹路径】:")
                for i, path in enumerate(self.source_paths, 1):
                    print(f"  {i}. {path}")
            else:
                print("【复制的文件夹路径】: (无)")
        
        if type == 2:
            if self.output_paths:
                print("【输出目录路径】:")
                for i, path in enumerate(self.output_paths, 1):
                    print(f"  {i}. {path}")
            else:
                print("【输出目录路径】: (无)")